home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / asmbler.arc / FIND.ASM < prev    next >
Assembly Source File  |  1988-11-19  |  10KB  |  433 lines

  1. CR      EQU     13
  2. LF      EQU     10
  3.  
  4. ASSUME  CS:FINDC,DS:FINDC
  5. FINDC   SEGMENT PARA PUBLIC 'CODE'
  6.  
  7.         DB      "MAUlloa/Microsoft/V126"
  8. COLON   DB      ':',' ' ; 16
  9. LINSTR  DB      '['     ; 18
  10. INTSTR  DB      8 DUP (0)       ; 19
  11. NOTFLG  DB      ; 21
  12. CNTFLG  DB      ; 22
  13. NUMFLG  DB      ; 23
  14.         DB      0,0     ; 24,25
  15. PCOUNT  DW      ; 26
  16. MCOUNT  DW      ; 28
  17.  
  18. FINDF   PROC    FAR
  19. FIND:   MOV     AH,30H          ; GET DOS VERSION
  20.         INT     21H
  21.         CMP     AL,2
  22.         JGE     CONT
  23.         PUSH    CS
  24.         POP     DS
  25.         MOV     DX,OFFSET BADDOS
  26.         MOV     AH,09H          ; PRINT STRING
  27.         INT     21H
  28.         PUSH    ES
  29.         XOR     AX,AX
  30.         PUSH    AX
  31.         RET
  32. FINDF   ENDP
  33.  
  34. ASSUME  CS:FINDC,DS:FINDC
  35.  
  36. FINDN   PROC    NEAR
  37. CONT:   PUSH    CS
  38.         POP     ES
  39.         MOV     SI,81H
  40.         CALL    SKIPSP
  41.         OR      BX,BX
  42.         JZ      HAVEPARAM
  43. CNTERR: MOV     DX,OFFSET NUMERR
  44.         MOV     CL,CS:NUMLEN
  45.         CALL    WRITEDSERR
  46.         MOV     AL,2
  47.         JMP     ERREXIT
  48.  
  49. HAVEPARAM:
  50.         MOV     AH,37H          ; INTERNAL CALL         GET SWITCHAR
  51.         MOV     AL,0            ; 1 = SET SWITCHAR ??
  52.         INT     21H
  53.         PUSH    DX
  54.  
  55. SCANSWITCH:
  56.         LODSB
  57.         CMP     AL,' '
  58.         JZ      MORESP
  59.         CMP     AL,CR
  60.         JZ      CNTERR
  61.         POP     DX
  62.         CMP     AL,DL
  63.         JNZ     SCANPAT
  64.         PUSH    DX
  65.         LODSB
  66.         CMP     AL,' '
  67.         JZ      MORESP
  68.         CMP     AL,CR
  69.         JZ      CNTERR
  70.         CALL    LCUC
  71.         MOV     BX,OFFSET NOTFLG
  72.         CMP     AL,'V'
  73.         JZ      SETNOT
  74.         CMP     AL,'C'
  75.         JZ      SETCNT
  76.         CMP     AL,'N'
  77.         JZ      SETNUM
  78.         MOV     ES:PATTRN[0],AL
  79.         MOV     DX,OFFSET PRMERR
  80.         MOV     CL,CS:PRMLEN
  81.         CALL    WRITEDSERR
  82.         MOV     DX,OFFSET PATTRN
  83.         MOV     CX,1
  84.         CALL    WRITEDSERR
  85.         MOV     DX,OFFSET CRLF
  86.         MOV     CX,2
  87.         CALL    WRITEDSERR
  88.         JMP     SCANSWITCH
  89. SETNOT: MOV     DI,0
  90.         JMP     SHORT SETFLG
  91. SETCNT: MOV     DI,1
  92.         JMP     SHORT SETFLG
  93. SETNUM: MOV     DI,2
  94. SETFLG: MOV     ES:BYTE PTR [BX+DI],-1
  95.         JMP     SCANSWITCH
  96. MORESP: DEC     SI
  97.         CALL    SKIPSP
  98.         OR      BX,BX
  99.         JZ      SCANSWITCH
  100.         JMP     CNTERR
  101.  
  102. SCANPAT:
  103.         CMP     AL,'"'
  104.         JNZ     NOPAT
  105.         MOV     DI,OFFSET PATTRN
  106.         XOR     CX,CX
  107. PATCH:  LODSB
  108.         CMP     AL,CR
  109.         JNZ     STLPAT
  110. NOPAT:  MOV     DX,OFFSET SYNERR
  111.         MOV     CL,CS:SYNLEN
  112.         CALL    WRITEDSERR
  113.         MOV     AL,2
  114.         JMP     ERREXIT
  115. STLPAT: CMP     AL,'"'
  116.         JNZ     STOCH
  117.         LODSB
  118.         CMP     AL,'"'
  119.         JZ      STOCH
  120.         DEC     SI
  121.         MOV     ES:PATLEN,CX
  122.         OR      CX,CX
  123.         JNZ     HAVPAT
  124.         MOV     AL,1
  125.         JMP     ERREXIT
  126. STOCH:  STOSB
  127.         INC     CX
  128.         JMP     PATCH
  129. HAVPAT: CALL    SKIPSP
  130.         OR      BX,BX
  131.         JZ      HAVFIL
  132.         PUSH    CS
  133.         POP     DS
  134.         MOV     AX,0
  135.         JMP     DOREAD
  136. HAVFIL: CALL    CLRCNT
  137.         MOV     DI,OFFSET FILNAM
  138.         XOR     CX,CX
  139. FILCH:  LODSB
  140.         CMP     AL,' '
  141.         JZ      FILEND
  142.         CMP     AL,CR
  143.         JZ      FILEND
  144.         STOSB
  145.         INC     CX
  146.         JMP     FILCH
  147. FILEND: DEC     SI
  148.         MOV     ES:BYTE PTR [DI],0
  149.         PUSH    SI
  150.         PUSH    DS
  151.         MOV     ES:FILLEN,CX
  152.         PUSH    CS
  153.         POP     DS
  154.         MOV     DX,OFFSET FILNAM
  155.         MOV     AH,3DH          ; OPEN FILE
  156.         MOV     AL,0
  157.         INT     21H
  158.         JNB     FILOPN
  159.         JMP     BADFIL
  160. FILOPN: PUSH    AX
  161.         MOV     DX,OFFSET SEPLIN
  162.         MOV     CL,CS:SEPLEN
  163.         XOR     CH,CH
  164.         CALL    WRITESTR
  165.         MOV     DX,OFFSET FILNAM
  166.         MOV     CX,FILLEN
  167.         CALL    WRITESTR
  168.         CMP     CNTFLG,-1
  169.         JZ      NOCRLF
  170.         MOV     DX,OFFSET CRLF
  171.         MOV     CX,2
  172.         CALL    WRITESTR
  173. NOCRLF: POP     AX
  174. DOREAD: MOV     BX,AX
  175. NXTREAD:MOV     DX,OFFSET BUFFER
  176.         MOV     CX,4096
  177.         MOV     AH,3FH          ; READ FILE
  178.         INT     21H
  179.         JNB     DIDREAD
  180.         JMP     BADREAD
  181. DIDREAD:OR      AX,AX
  182.         JNZ     GREPBUF
  183.         CMP     CNTFLG,-1
  184.         JNZ     NOCNT
  185.         CALL    WRITECNT
  186. NOCNT:  CMP     BX,0
  187.         JNZ     DOCLOSE
  188.         JMP     NRMEXIT
  189. DOCLOSE:MOV     AH,3EH          ; CLOSE FILE
  190.         INT     21H
  191.         JMP     NXTFIL
  192.  
  193. GREPBUF:PUSH    BX
  194.         MOV     BP,OFFSET BUFFER
  195.         MOV     DI,AX
  196.         CMP     AX,4095
  197.         JG      NOPATCH
  198.         MOV     BX,BP
  199.         CMP     BYTE PTR [BX+DI-01],LF
  200.         JZ      NOPATCH
  201.         MOV     BYTE PTR [BX+DI],CR
  202.         INC     DI
  203.         MOV     BYTE PTR [BX+DI],LF
  204.         INC     DI
  205. NOPATCH:PUSH    DI
  206.         PUSH    BP
  207.         MOV     DX,PATLEN
  208.         DEC     DX
  209. NXTSCN: INC     MCOUNT
  210.         POP     BP
  211.         MOV     DI,BP
  212.         POP     CX
  213.         MOV     BX,CX
  214.         MOV     AL,LF
  215.         JCXZ    NOFULLN
  216.         REPNZ   SCASB
  217.         JNZ     NOFULLN
  218.         PUSH    CX
  219.         PUSH    DI
  220.         MOV     CX,DI
  221.         SUB     CX,BP
  222.         MOV     BX,CX
  223.         DEC     CX
  224.         DEC     CX
  225.         JCXZ    NOTFND
  226.         MOV     DI,BP
  227. SAMLN:  MOV     SI,OFFSET PATTRN
  228.         LODSB
  229.         REPNZ   SCASB
  230.         JNZ     NOTFND
  231.         CMP     CX,DX
  232.         JB      NOTFND
  233.         PUSH    DI
  234.         PUSH    CX
  235.         MOV     CX,DX
  236.         JCXZ    DIDFND
  237.         REPZ    CMPSB
  238.         JZ      DIDFND
  239.         POP     CX
  240.         POP     DI
  241.         JMP     SAMLN
  242. DIDFND: POP     AX
  243.         POP     AX
  244.         CMP     NOTFLG,-1
  245.         JNZ     NEGNOT
  246.         JMP     NXTSCN
  247. NOTFND: CMP     NOTFLG,-1
  248.         JNZ     NXTSCN
  249. NEGNOT: CMP     CNTFLG,-1
  250.         JNZ     NOCOUNT
  251.         INC     PCOUNT
  252.         JMP     NXTSCN
  253. NOCOUNT:PUSH    DX
  254.         CMP     NUMFLG,-1
  255.         JNZ     NOLNNUM
  256.         CALL    WRITELNNUM
  257. NOLNNUM:MOV     DX,BP
  258.         MOV     CX,BX
  259.         CALL    WRITESTR
  260.         POP     DX
  261.         JMP     NXTSCN
  262. NOFULLN:MOV     DX,BX
  263.         POP     BX
  264.         OR      DX,DX
  265.         JZ      WHATISTHIS
  266.         NEG     DX
  267.         MOV     CX,-1
  268.         MOV     AL,1
  269.         MOV     AH,42H          ; LSEEK
  270.         INT     21H
  271.         JB      BADREAD
  272. WHATISTHIS:
  273.         JMP     NXTREAD
  274.  
  275. ASSUME  CS:FINDC
  276.  
  277. BADREAD:
  278.         CMP     BX,0
  279.         JZ      NRMEXIT
  280.         MOV     AH,3EH          ; CLOSE FILE
  281.         INT     21H
  282.         MOV     DX,OFFSET RDDERR
  283.         MOV     CL,CS:RDDLEN
  284.         JMP     DOWRITE
  285. BADFIL: MOV     DX,OFFSET FNDERR
  286.         MOV     CL,CS:FNDLEN
  287. DOWRITE:CALL    WRITEERR
  288.         CALL    WRITEFIL
  289. NXTFIL: POP     DS
  290.         POP     SI
  291.         CALL    SKIPSP
  292.         OR      BX,BX
  293.         JNZ     NRMEXIT
  294.         JMP     HAVFIL
  295. NRMEXIT:MOV     AL,0
  296. ERREXIT:MOV     AH,4CH          ; EXIT
  297.         INT     21H
  298.  
  299. SKIPSP: CLD
  300.         XOR     BX,BX
  301. HAVESP: LODSB
  302.         CMP     AL,' '
  303.         JZ      HAVESP
  304.         CMP     AL,CR
  305.         JNZ     NOCR
  306.         MOV     BX,AX
  307. NOCR:   DEC     SI
  308.         RET
  309.  
  310. CLRCNT: MOV     ES:BYTE PTR PCOUNT,0
  311.         MOV     ES:BYTE PTR MCOUNT,0
  312.         RET
  313.  
  314. WRITECNT:
  315.         PUSH    BX
  316.         CMP     BX,0
  317.         JZ      NOCOLON
  318.         MOV     DX,OFFSET COLON
  319.         MOV     CX,2
  320.         CALL    WRITESTR
  321. NOCOLON:MOV     AX,PCOUNT
  322.         MOV     DI,OFFSET INTSTR
  323.         CALL    WRITEINT
  324.         MOV     DX,OFFSET INTSTR
  325.         CALL    WRITESTR
  326.         MOV     DX,OFFSET CRLF
  327.         MOV     CX,2
  328.         CALL    WRITESTR
  329.         POP     BX
  330.         RET
  331.  
  332. WRITELNNUM:
  333.         PUSH    BX
  334.         PUSH    DX
  335.         MOV     AX,MCOUNT
  336.         MOV     DI,OFFSET INTSTR
  337.         CALL    WRITEINT
  338.         MOV     BYTE PTR [DI],']'
  339.         INC     CX
  340.         INC     CX
  341.         MOV     DX,OFFSET LINSTR
  342.         CALL    WRITESTR
  343.         POP     DX
  344.         POP     BX
  345.         RET
  346.  
  347. WRITESTR:
  348.         MOV     BX,1
  349.         MOV     AH,40H          ; WRITE FILE
  350.         INT     21H
  351.         RET
  352.  
  353. WRITEINT:
  354.         MOV     BX,10
  355.         XOR     CX,CX
  356. INTDIV: INC     CX
  357.         CMP     AX,BX
  358.         JB      INTDONE
  359.         XOR     DX,DX
  360.         DIV     BX
  361.         ADD     DL,'0'
  362.         PUSH    DX
  363.         JMP     INTDIV
  364. INTDONE:ADD     AL,'0'
  365.         PUSH    AX
  366.         MOV     BX,CX
  367. INTSTO: POP     AX
  368.         STOSB
  369.         LOOP    INTSTO
  370.         MOV     CX,BX
  371.         RET
  372.  
  373. WRITEFIL:
  374.         MOV     DX,OFFSET FILNAM
  375.         MOV     CX,FILLEN
  376.         CALL    WRITEERR
  377.         MOV     DX,OFFSET CRLF
  378.         MOV     CX,2
  379.         CALL    WRITEERR
  380.         RET
  381.  
  382. WRITEDSERR:
  383.         PUSH    DS
  384.         PUSH    CS
  385.         POP     DS
  386.         CALL    WRITEERR
  387.         POP     DS
  388.         RET
  389.  
  390. WRITEERR:
  391.         XOR     CH,CH
  392.         MOV     BX,2
  393.         MOV     AH,40H          ; WRITE FILE
  394.         INT     21H
  395.         RET
  396.  
  397. LCUC:   CMP     AL,'a'
  398.         JB      OK
  399.         CMP     AL,'z'
  400.         JG      OK
  401.         AND     AL,NOT 20H
  402. OK:     RET
  403.  
  404. PATLEN  DW      ; 0332
  405. PATTRN  DB      128 DUP (0)     ; 0334
  406. FILLEN  DW      ; 03B4
  407. FILNAM  DB      65 DUP (0)      ; 03B6
  408. BUFFER  DB      4096 DUP (0)    ; 03F7
  409.         DB      9 DUP (0)
  410. BADDOS  DB      "Incorrect DOS version$"        ; 00
  411. CRLF    DB      CR,LF                           ; 16
  412. NUMERR  DB      "FIND: Invalid number of parameters",CR,LF      ; 18
  413. NUMLEN  DB      NUMLEN-NUMERR                   ; 3C
  414. SYNERR  DB      "FIND: Syntax error",CR,LF      ; 3D
  415. SYNLEN  DB      SYNLEN-SYNERR                   ; 51
  416. FNDERR  DB      "FIND: File not found "         ; 52
  417. FNDLEN  DB      FNDLEN-FNDERR                   ; 67
  418. RDDERR  DB      "FIND: Read error in "          ; 68
  419. RDDLEN  DB      RDDLEN-RDDERR                   ; 7C
  420. PRMERR  DB      "FIND: Invalid Parameter "      ; 7D
  421. PRMLEN  DB      PRMLEN-PRMERR                   ; 95
  422. SEPLIN  DB      CR,LF,"---------- "             ; 96
  423. SEPLEN  DB      SEPLEN-SEPLIN                   ; A3
  424.  
  425. FINDN   ENDP
  426. FINDC   ENDS
  427.  
  428. FINDS   SEGMENT STACK
  429.         DB      256 DUP (?)
  430. FINDS   ENDS
  431.  
  432.         END     FIND
  433.